package com.xiaoming.e3mall.content.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xiaoming.e3mall.common.jedis.JedisClient;
import com.xiaoming.e3mall.common.pojo.EasyUIDataGridResult;
import com.xiaoming.e3mall.common.utils.E3Result;
import com.xiaoming.e3mall.common.utils.JsonUtils;
import com.xiaoming.e3mall.content.service.ContentService;
import com.xiaoming.e3mall.mapper.TbContentMapper;
import com.xiaoming.e3mall.pojo.TbContent;
import com.xiaoming.e3mall.pojo.TbContentExample;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;


/**
 * 前台内容服务
 */

@Service
public class ContentServiceImpl implements ContentService {


    @Autowired
    private TbContentMapper contentMapper;

    @Autowired
    private JedisClient jedisClient;

    //内容列表在reids中缓存的key
    @Value("{CONTENT_LIST}")
    private String CONTENT_LIST;
    //分页查询的内容列表
    @Value("${CONTENT_LIST_PAGE}")
    private String CONTENT_LIST_PAGE;

    /**
     * 为前台指定区域 添加内容
     */
    @Override
    public E3Result addContent(TbContent content) {
        //前端传过来的基本上比较全了但是还是需要我们补充一部分
        content.setCreated(new Date());
        content.setUpdated(new Date());
        //持久化到数据库
        contentMapper.insert(content);

        //做缓存同步,这里是增加一个新的内容,做法是将原来从数据中查的hash的key删除
        //重新再查一遍 (不是特别理解)
        jedisClient.del(CONTENT_LIST);
        jedisClient.del(CONTENT_LIST_PAGE);
        return E3Result.ok();
    }

    /**
     * 查询 content (分页处理)
     * 后天展示 商品的列表
     *
     * 添加 redis缓存
     */
    @Override
    public EasyUIDataGridResult query(Long categoryId, int page, int rows) {

        try {
            //先查询缓存中是否存在  key:CONTENT_LIST_PAGE  fild:categoryId+page+rows(拼接)
            //有缓存
            String json = jedisClient.hget(CONTENT_LIST_PAGE, "" + categoryId + page + rows);
            if(StringUtils.isNotBlank(json)){
                EasyUIDataGridResult result = JsonUtils.jsonToPojo(json, EasyUIDataGridResult.class);
                System.out.println(result);
                return result;
            }

        }catch (Exception e){
            e.printStackTrace();
        }

        //redis缓存中没有

        //设置分页信息
        //获取第page页 rows条内容 默认查询总数count
        PageHelper.startPage(page,rows);
        //上面语句紧跟着的第一个select方法会被分页
        //执行查询

        //categoryId是前台的分类id 如果是0的话默认全部查询
        TbContentExample example = new TbContentExample();
        TbContentExample.Criteria criteria = example.createCriteria();
        if(categoryId!=0)
            criteria.andCategoryIdEqualTo(categoryId);
        List<TbContent> contentList = contentMapper.selectByExampleWithBLOBs(example);

        //取分页信息(第二种方式)
        PageInfo<TbContent> pageInfo = new PageInfo<>(contentList);
        //创建返回的对象并根据PageInfo封装
        EasyUIDataGridResult result = new EasyUIDataGridResult();
        //设置EasyUi需要的总条数
        result.setTotal((int) pageInfo.getTotal());
        result.setRows(contentList);

        //将查询结果添加到redis缓存中
        try {
            jedisClient.hset(CONTENT_LIST_PAGE, ""+categoryId+page+rows,JsonUtils.objectToJson(result));
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 根据初始的前台id查询 内容
     *    添加redis缓存
     */
    @Override
    public List<TbContent> getContentByCid(Long cid) {
        //查询缓存
        try {
            //如果缓存中有直接响应结果
            // hget key filed
            String json = jedisClient.hget(CONTENT_LIST, cid + "");
            if(StringUtils.isNotBlank(json)){
                List<TbContent> contentList = JsonUtils.jsonToList(json, TbContent.class);
                return contentList;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        //如果没有查询数据库


        TbContentExample example = new TbContentExample();
        TbContentExample.Criteria criteria = example.createCriteria();
        //设置查询条件
        criteria.andCategoryIdEqualTo(cid);
        List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);

        //将结果添加到缓存
        try {
            //添加hash类型  hset key filed value
            jedisClient.hset(CONTENT_LIST, cid+"", JsonUtils.objectToJson(list));

        }catch (Exception e){
            e.printStackTrace();
        }
        return list;

    }
}
